/**
 * ajax函数
 * @param {object} opt  ajax请求的数据  {url,method,data,async,dataType,success}
 */
function ajax(opt){
  // 1. 判断是否传递了url请求地址
  if(!opt.url){
    // 抛出异常
    throw Error("请求地址url必须传递");
  }
  // 2. 设置一个默认的参数值对象
  let info = {
    method:'get',
    data:{},
    async:true,
    dataType:'string',
    success(res){
      return res;
    }
  }
  // 3. 遍历传递的参数对象，替换调用默认参数对象中的数据
  for (const key in opt) {
    info[key] = opt[key];
  }

  // 4. 拼接参数成为查询字符串
  // 遍历请求携带的数据对象
  let str = '';
  for (const key in info.data) {
    str += `${key}=${info.data[key]}&`;
  }
  // 最后会多一个&，可以使用字符串的截取
  str = str.slice(0,-1);


  // 发起ajax请求
  // 创建ajax对象
  const xhr = new XMLHttpRequest();
  // 配置请求信息,并发送请求
  if(info.method.toLowerCase() === 'get'){ // get请求
    xhr.open('get',`${info.url}?${str}`);
    xhr.send();
  }else{
    xhr.open('post', info.url);
    // 设置请求头
    xhr.setRequestHeader('content-type','application/x-www-form-urlencoded');
    xhr.send(str);
  }

  // 接受响应
  xhr.onreadystatechange = ()=>{
    if(xhr.status===200&&xhr.readyState===4){
      // 判断是否需要处理响应的数据
      let res;
      if(info.dataType==='string'){
        res = xhr.responseText;
      }else{
        res = JSON.parse(xhr.responseText);
      }
      // 调用请求结束后要执行的函数
      info.success(res);
    }
  }
}


// 使用promise封装ajax请求
function pAjax(option){
  let p = new Promise((resolve,reject)=>{
    // 调用ajax函数发起ajax请求
    ajax({
      url:option.url,
      method:option.method||'get',
      data:option.data||{},
      async:typeof(option.async)==='boolean'?option.async:true,
      dataType:option.dataType||'string',
      success:option.success||function(res){
        resolve(res);
      }
    })
  });
  // 返回promise对象
  return p;
}